package com.zyx.test1;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;

/**
 * Stream 数据源、集合、数组
 * 集合讲的是数据 流讲的是计算
 * Stream不会存储数据 不会改变源对象
 *
 *
 * Stream的操作步骤：
 * 1.创建Stream
 * 2.进行中间操作
 * 3.终止操作
 */
public class StreamTest {

    @Test
    public void test1() {

        // 创建Stream
        // 1.可以通过Collection系列集合提供的Stream()或parallelStream()串行流和并行流
        List<String> list = new ArrayList<>();
       Stream<String> stringStream = list.stream();
       // 2.通过Array[]的静态方法
        String[] strings = new String[10];
        Stream<String> stringStream1 =Arrays.stream(strings);
        //3.通过Stream的静态方法
      Stream<String>  s= Stream.of("11","22","33","44");
      // 4.创建无限流
        //迭代
       Stream<Integer> integerStream= Stream.iterate(0,(x) -> x + 2);
       integerStream.forEach((f) -> {
           System.out.println(f);
       }); // 类似于 integerStream.forEach.System.out::println

    }
    //Stream的中间操作

    /**
     * 多个中间操作可以连起来一个流水线，除非流水线终止操作，否则流水线不会做任何处理，而在终止操作时一次性处理
     * 叫做：惰性求值
     * 内部迭代：迭代由StreamAPI完成
     * 内部迭代：
     */
    @Test
    public void test2() {

    }

    /**
     * 映射
     * map 接收lambda,将元素转换为其他形式或提取信息，接收一个函数作为入参，这个函数会应用到每一个元素中然后映射成一个新的元素
     * flatmap 接收一个函数作为参数，将流中的每一个元素转为一个新流，然后把所有的流连成同一个流
     */
    @Test
    public void test3() {
     List<String> list = Arrays.asList("aaaa","bbbb","cccccc","dddddddd");
     list.stream()
             .map((m) -> m+"zyx")
             .forEach((m) -> System.out.println(m));

    }

    @Test
    public void test4() {
        List<String> list = Arrays.asList("aaaa","bbbb","cccccc","dddddddd");
        list.stream()
                .flatMap((f) -> filterCharacter(f))
                .forEach((m) -> System.out.println(m));

    }

    // 获取每个元素
    public static Stream<Character> filterCharacter(String str) {
        List<Character> list = new ArrayList<>();
        for(Character character : str.toCharArray()) {
            list.add(character);
        }
        return list.stream();
    }
}
